home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
docs
/
ippon
/
data
/
etc
/
lboss03.lzh
/
enemy.c
next >
Wrap
C/C++ Source or Header
|
1999-04-30
|
11KB
|
522 lines
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <XSP2lib.H>
#include "main.h"
#include "enemy.h"
#include "fxsp2lib.h"
#include "parts.h"
#define ENEMY_MAX 256 /* 最大数 */
#define P1_K 0.5 /* ばね定数(左右大パーツ) */
#define P1_M 0.2 /* 摩擦計数(左右大パーツ) */
#define P1_V 0.5 /* 速度がこれ以下なら次へ(左右大パーツ) */
#define P1_L 0.4 /* 座標がこれ以下なら次へ(左右大パーツ) */
/* 2段階目大パーツ合体時 */
#define P3_K 1.5 /* ばね定数 */
#define P3_M 0.10 /* 摩擦計数 */
#define P3_V 0.8 /* 速度がこれ以下なら次へ */
#define P3_L 0.8 /* 座標がこれ以下なら次へ */
/* 2段階目左右翼パーツ */
#define P5_K 1.6 /* ばね定数(左右上小パーツ) */
#define P5_M 0.12 /* 摩擦計数(左右上小パーツ) */
#define P5_V 0.1 /* 速度がこれ以下なら次へ(左右上小パーツ) */
#define P5_L 0.1 /* 座標がこれ以下なら次へ(左右上小パーツ) */
/* 2段階目左右耳パーツ */
#define P7_K 3.0 /* ばね定数(左右上小パーツ) */
#define P7_M 0.02 /* 摩擦計数(左右上小パーツ) */
#define P7_V 0.1 /* 速度がこれ以下なら次へ(左右上小パーツ) */
#define P7_L 0.1 /* 座標がこれ以下なら次へ(左右上小パーツ) */
static ENEMY *enemy_top, /* 使用中のワークのリスト */
*enemy_null_top, /* 空のワークのリスト */
*enemy_end; /* 使用中ワークのリストの末尾 */
static ENEMY enemy[ENEMY_MAX]; /* ワーク */
extern char end_of_data;
extern char f_option_flag;
typedef struct _spwork {
signed short x, y; /* 座標 */
unsigned short pt; /* スプライトパターンNo. */
unsigned short info; /* 反転コード・色・優先度を表わすデータ */
} SPWORK;
SPWORK spwork;
FILE *fp_parts1;
int EnemyInit0 (void)
{
int i;
/* リストをつなげる */
enemy_top = NULL;
enemy_end = NULL;
enemy_null_top = enemy;
for (i = 0; i < ENEMY_MAX; i++)
enemy[i].next = &enemy[i + 1];
enemy[ENEMY_MAX - 1].next = NULL;
return (0);
}
void EnemyInit (unsigned short type, unsigned short info,
signed short ox, signed short oy, ENEMY * parent)
{
ENEMY *p;
if (enemy_null_top == NULL) {
printf ("ワークが一杯です\n");
return; /* 空きのワークがない(キャラクターオーバー) */
}
/* リストの末尾に新しいノードを追加 */
p = enemy_null_top;
enemy_null_top = p->next;
if (enemy_top == NULL)
enemy_top = p;
else
enemy_end->next = p;
p->next = NULL;
enemy_end = p;
p->type = type;
p->info = info;
p->ox = ox;
p->oy = oy;
p->x = 0;
p->y = 0;
p->parent = parent;
p->lx = 0.0;
p->ly = 0.0;
p->lz = 0.0;
p->vx = 0.0;
p->vy = 0.0;
p->vz = 0.0;
p->cyc = 0;
p->cyc1 = 0;
switch (p->type) {
case 1:
p->lz = 1.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 1.0;
if (f_option_flag)
fp_parts1 = fopen ("parts1.doc", "w");
switch (p->ox) {
case 0:
p->ox = -32;
p->oy = -32;
break;
case 1:
p->ox = 32;
p->oy = -32;
break;
case 2:
p->ox = -32;
p->oy = 32;
break;
case 3:
p->ox = 32;
p->oy = 32;
break;
}
break;
#if 0
case 3: /* 2段階目大パーツ */
if (f_option_flag)
fp_parts3 = fopen ("parts3.doc", "w");
p->ly = 192.0;
p->vy = -6.4;
break;
case 5:
if (f_option_flag)
fp_parts5 = fopen ("parts5.doc", "w");
break;
case 6:
if (f_option_flag)
fp_parts6 = fopen ("parts6.doc", "w");
break;
case 7:
if (f_option_flag)
fp_parts7 = fopen ("parts7.doc", "w");
break;
case 8:
if (f_option_flag)
fp_parts8 = fopen ("parts8.doc", "w");
break;
#endif
default:
break;
}
}
/* 複数のスプライトで構成されているパーツ1個分のスプライトをまとめて表示 */
static void DispSp (ENEMY * p, short sp_num, PARTS_TABLE * parts_table)
{
short h;
for (h = 0; h < sp_num; h++) {
p->x = p->lx + p->ox;
p->y = p->ly + p->oy;
if (p->parent != NULL) {
spwork.x = p->x + p->parent->x + parts_table[h].x;
spwork.y = p->y + p->parent->y + parts_table[h].y;
} else {
spwork.x = p->x + parts_table[h].x;
spwork.y = p->y + parts_table[h].y;
}
spwork.pt = parts_table[h].pt;
spwork.info = p->info;
spwork.x += (128 + 16); /* 表示用に補正 */
spwork.y += (128 + 16);
xsp_set_st (&spwork);
fxsp_set_st (&spwork);
spwork.x -= (128 + 16);
spwork.y -= (128 + 16);
}
}
void EnemyMove (void)
{
ENEMY *p, *q;
p = enemy_top;
q = NULL;
while (p != NULL) {
char erase_flag = 0;
switch (p->type) {
case 0: /* 本体 */
DispSp (p, 64, parts0_table);
// erase_flag = !0;
break;
case 1: /* パーツ */
switch (p->cyc) {
case 0: /* ばね振動 */
p->vz -= p->lz * P5_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P5_M;
else
p->vz += P5_M;
p->lz += p->vz;
p->lx = p->ox/32.0 * p->lz;
p->ly = p->oy/32.0 * p->lz;
if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
end_of_data = !0; /* debug */
}
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts1, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 25, parts1_table);
// erase_flag = !0;
break;
#if 0
case 2: /* 1段階目で分離した頭 */
DispSp (p, 30, parts2_table);
erase_flag = !0;
break;
case 3: /* 2段階目大パーツ */
switch (p->cyc) {
case 0:
p->ly += p->vy;
if (p->ly < 32.0)
p->cyc++;
break;
case 1:
if ((p->ly > 1.0) && (p->vy < -1.2))
p->vy += 0.8;
p->ly += p->vy;
if (p->ly < 1.0)
p->cyc++;
break;
case 2:/* ばね振動 */
p->vy -= p->ly * P3_K;
/* 摩擦 */
if (p->vy > 0)
p->vy -= P3_M;
else
p->vy += P3_M;
p->ly += p->vy;
if ((fabs (p->vy) < P3_V) && (fabs (p->ly) < P3_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
case 3:
erase_flag = !0;
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts3, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 60, parts3_table);
break;
case 4: /* 2段階目本体 */
DispSp (p, 90, parts4_table);
break;
case 5: /* 左翼パーツ */
switch (p->cyc) {
case 0:
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = (18 - 54) * p->lz; /* 終点-始点 */
p->ly = (168 - 143) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox += (18 - 54);
p->oy += (168 - 143);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P5_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P5_M;
else
p->vz += P5_M;
p->lz += p->vz;
p->lx = (18 - 54) * p->lz;
p->ly = (168 - 143) * p->lz;
if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts5, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 16, parts5_table);
break;
case 6: /* 右翼パーツ */
switch (p->cyc) {
case 0:
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = -(18 - 54) * p->lz; /* 終点-始点 */
p->ly = (168 - 143) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox -= (18 - 54);
p->oy += (168 - 143);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P5_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P5_M;
else
p->vz += P5_M;
p->lz += p->vz;
p->lx = -(18 - 54) * p->lz;
p->ly = (168 - 143) * p->lz;
if ((fabs (p->vz) < P5_V) && (fabs (p->lz) < P5_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts6, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 16, parts6_table);
break;
case 7: /* 左耳パーツ */
switch (p->cyc) {
case 0:
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = (65 - 68) * p->lz; /* 終点-始点 */
p->ly = (115 - 134) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox += (65 - 68);
p->oy += (115 - 134);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P7_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P7_M;
else
p->vz += P7_M;
p->lz += p->vz;
p->lx = (65 - 68) * p->lz;
p->ly = (115 - 134) * p->lz;
if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
end_of_data = !0; /* debug */
}
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts7, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 9, parts7_table);
break;
case 8: /* 右耳パーツ */
switch (p->cyc) {
case 0:
p->cyc++; /* 次へ */
p->lz = 0.0; /* 始点が 0.0, 終点が 1.0 */
p->vz = 0.0;
break;
case 1:/* 加速度的に離れる */
if (p->vz < 0.20)
p->vz += 0.10;
p->lz += p->vz;
p->lx = -(65 - 68) * p->lz; /* 終点-始点 */
p->ly = (115 - 134) * p->lz;
if (p->lz > 1.0) {
p->cyc++; /* 次へ */
p->lz = 0.0;
p->lx = 0.0; /* 今度はここが原点になる */
p->ly = 0.0;
p->ox -= (65 - 68);
p->oy += (115 - 134);
}
break;
case 2:/* ばね振動 */
p->vz -= p->lz * P7_K;
/* 摩擦 */
if (p->vz > 0)
p->vz -= P7_M;
else
p->vz += P7_M;
p->lz += p->vz;
p->lx = -(65 - 68) * p->lz;
p->ly = (115 - 134) * p->lz;
if ((fabs (p->vz) < P7_V) && (fabs (p->lz) < P7_L)) {
p->cyc++; /* 次へ */
p->lx = 0.0;
p->ly = 0.0;
p->vx = 0.0;
p->vy = 0.0;
}
break;
default:
break;
}
if (f_option_flag)
fprintf (fp_parts8, "{%d,%d}, ", (int) (p->lx + p->ox), (int) (p->ly + p->oy));
DispSp (p, 9, parts8_table);
break;
#endif
default:
printf ("enemy_move() : バグってます\n");
break;
}
if (erase_flag) {
if (q == NULL) { /* リストの一番最初を削除 */
enemy_top = p->next;
p->next = enemy_null_top;
enemy_null_top = p;
q = NULL;
p = enemy_top;
} else {
q->next = p->next;
p->next = enemy_null_top;
enemy_null_top = p;
p = q->next;
}
} else {
q = p;
p = p->next;
}
}
}
void EnemyTini (void)
{
int i;
/* リストをつなげる */
enemy_top = NULL;
enemy_null_top = enemy;
for (i = 0; i < ENEMY_MAX; i++)
enemy[i].next = &enemy[i + 1];
enemy[ENEMY_MAX - 1].next = NULL;
}